package com.boot2.core;

import com.boot2.core.dao.jpa.AuditorInfo;
import com.boot2.core.utils.ReflectUtil;
import com.boot2.core.utils.SpringUtil;
import lombok.extern.apachecommons.CommonsLog;

import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import java.util.Date;

@CommonsLog
public class JpaBaseEntityAuditListener {
    /**
     * 被@Prepersist注解的方法 ，完成save之前的操作。
     *
     * @param object
     */
    @PrePersist
    public void prePersist(Object object) {
        AuditorInfo<?> auditorInfo = SpringUtil.getBean(AuditorInfo.class);
        if (null == auditorInfo) {
            return;
        }
        ReflectUtil.setFieldValueIfNull(object, "createrId", auditorInfo.getUserId());
        ReflectUtil.setFieldValueIfNull(object, "createrName", auditorInfo.getUserName());
        ReflectUtil.setFieldValueIfNull(object, "updaterId", auditorInfo.getUserId());
        ReflectUtil.setFieldValueIfNull(object, "updaterName", auditorInfo.getUserName());

        //兼容gmtCreate
        ReflectUtil.setFieldValueIfNull(object, "gmtCreate", new Date());

    }

    /**
     * 被@Preupdate注解的方法 ，完成update之前的操作。
     *
     * @param object
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    @PreUpdate
    public void preUpdate(Object object)  {
        AuditorInfo<?> auditorInfo = SpringUtil.getBean(AuditorInfo.class);
        if (null == auditorInfo) {
            return;
        }
        ReflectUtil.setFieldValueIfNull(object, "updaterId", auditorInfo.getUserId());
        ReflectUtil.setFieldValueIfNull(object, "updaterName", auditorInfo.getUserName());

        //兼容 gmtModified
        ReflectUtil.setFieldValueIfNull(object, "gmtModified", new Date());

    }


//    /**
//     * 被@Postpersist注解的方法 ，完成save之后的操作。
//     *
//     * @param object
//     * @throws IllegalArgumentException
//     * @throws IllegalAccessException
//     */
//    @PostPersist
//    public void postPersist(Object object)
//            throws IllegalArgumentException, IllegalAccessException {
//
//    }
//
//    /**
//     * 被@Postupdate注解的方法 ，完成update之后的操作。
//     *
//     * @param object
//     * @throws IllegalArgumentException
//     * @throws IllegalAccessException
//     */
//    @PostUpdate
//    public void postUpdate(Object object)
//            throws IllegalArgumentException, IllegalAccessException {
//    }

}